package day13;

import java.io.*;
import java.util.Scanner;

/*本类用于测试文件复制案例
* 需求:接收用户输入的文件路径来进行复制,复制到用户指定的路径下*/
public class TestCopyFile {
    public static void main(String[] args) {
        //1.提示并接收用户输入的源文件路径和模板文件路径
        System.out.println("请输入源文件的路径");//复制谁
        String f = new Scanner(System.in).nextLine();
        System.out.println("请输入目标文件的路径");//复制到哪
        String t = new Scanner(System.in).nextLine();
        //2.把接收到的路径进行封装,变成可以进行文件操作的File对象
        File from = new File(f);
        File to = new File(t);
        //3.调用复制方法进行复制
        ZJCopy(from,to);//自定义字节流复制文件的方法
        //ZFCopy(from,to);//自定义字符流复制文件的方法
    }
    private static void ZFCopy(File from,File to) {//字符流操作
        //注意局部变量需要初始化,此处变量的初始值应为null
        Reader in = null;//定义在整个方法都生效的字符输入流抽象父类类型的变量
        Writer out = null;//定义在整个方法都生效的字符输出流抽象父类类型的变量
        try{
            //1.通过输入流读取from--获取字符流输入对象
            in = new BufferedReader(new FileReader(from));
            //2.通过输出流输出到to--获取字符输出流对象
            out = new BufferedWriter(new FileWriter(to));
            //3.边读边写
            //3.1定义变量用来保存读到的数据
            int b = 0;
            while ((b = in.read()) != -1){
                out.write(b);//将本轮循环循环到的内容写出
            }
            System.out.println("恭喜您!文件复制成功!");
        }catch (Exception e){
            System.out.println("很抱歉!文件复制失败!");
            e.printStackTrace();
        }finally {
            /*1.流资源必须释放,释放的是之前使用过程中所有的流对象
            * 2.关流是有顺序的,注意,后创建的流先关闭,为了不影响其它的代码,不能先关最先创建的流*/
            //4.释放资源
            try {
                out.close();//关闭字符输出流
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();//关闭字符输入流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    private static void ZJCopy(File from,File to) {//字节流操作
        InputStream in = null;//定义整个方法都生效的字节流输入类型的变量
        OutputStream out = null;//定义整个方法都生效的字节流输出类型的变量
        try{
            //1.获取流(高效字节输入流与高效字节输出流)
            in = new BufferedInputStream(new FileInputStream(from));
            out = new BufferedOutputStream(new FileOutputStream(to));
            //2.复制操作边读边写
            int b = 0;
            while (( b = in.read()) != -1){
                out.write(b);
            }
            System.out.println("恭喜您!文件复制成功!");
        }catch (Exception e){
            System.out.println("很抱歉!文件复制失败!");
            e.printStackTrace();
        }finally {
            //3.释放资源
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
